#include "Erreur.h"

#include <List.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

/**
 * \struct _Erreur
 * \brief Définie la structure interne d'une erreur
 */
typedef struct _Erreur{
	int id;			/* Id de l'erreur */
	char* desc;		/* Description de l'erreur */
	time_t time;	/* Moment où l'erreur s'est produite */
} Erreur;

List* erreurList = NULL;

#define ER_MEM 1

void* emalloc(size_t size){
	void* p;
	
	p = malloc(size);
	if(p == NULL)
		erreurSetLast(ER_MEM,"emalloc failed");
	memset(p,0,size);
	
	return p;
}

Erreur* newErreur(int id,char* d,time_t t){
	Erreur* er;
	
	er = malloc(sizeof(Erreur));
	if(er == NULL) return NULL;
	
	er->id = id;
	er->desc = d;
	er->time = t;
	return er;
}

void erreurPrint2(int id,char* d,time_t t,FILE* fp){
	fprintf(fp,"ID %.2d : %s le \"%s\"\n",id,d,ctime(&t));
}

void erreurSetLast(int idErreur,char* desc){
	Erreur* er;
	if(erreurList == NULL)
		erreurList = newList();
	
	er = newErreur(idErreur,desc,time(NULL));
	
	if(er == NULL){
		erreurPrintLog(stderr);
		erreurPrint2(idErreur,desc,time(NULL),stderr);
		exit(-1);
	}
	
	listInsertLast(erreurList,(void*)er);	
}

void erreurPrintLog(FILE* fp){
	Erreur* er;
	
	if(erreurList == NULL || (er = (Erreur*)listGetFirst(erreurList)) == NULL){
		fprintf(fp,"Aucune erreur precedement loggee\n");
		return;
	}
	
	do{
		erreurPrint2(er->id,er->desc,er->time,fp);
	}while((er = listGetNext(erreurList)) == NULL);
}
